package com.zxcl.service.impl;

import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zxcl.mapper.SysMenuMapper;
import com.zxcl.domain.SysMenu;
import com.zxcl.service.SysMenuService;
import org.springframework.util.CollectionUtils;



@Service
@CacheConfig(cacheNames = "com.zxcl.service.impl.SysMenuServiceImpl")   //设置缓存名
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService{

    /**
     * 1.查询数据库得到的原始菜单 转成树形结构
     * 2根据用户ID缓存数据
     * @param userId
     * @return
     */
    @Override
    @Cacheable(key = "#userId") // 去redis中取你传入userId
    public List<SysMenu> findUserMenus(Long userId) {
        //根据用户ID查询用户的菜单
        List<SysMenu> menuList=this.getBaseMapper().selectMenusByUserId(userId);
        if (!CollectionUtils.isEmpty(menuList)) {
            // 转成树形结构
            menuList = translateMenuTree(menuList, 0L);
        }
        return menuList;
    }

    /**
     * 加载菜单
     * @return
     */
    @Override
    public List<SysMenu> loadSysMenuList() {
        return getBaseMapper().selectList(null);
    }

    /**
     *
     * @param menuList
     * @param parentId
     * @return
     */
    private List<SysMenu> translateMenuTree(List<SysMenu> menuList, long parentId) {
//        List<SysMenu> roots2=new ArrayList<>();
//        for (SysMenu sysMenu : menuList) {
//            if(sysMenu.getParentId().equals(0L)){
//                roots2.add(sysMenu);
//            }
//        }

        //找出所有根节点
//        List<SysMenu> roots = menuList.stream().
//                filter(sysMenu -> sysMenu.getParentId().equals(0L)).collect(Collectors.toList());
//        roots.forEach(sysMenu -> {
//            menuList.forEach(menu->{
//                if(menu.getParentId().equals(sysMenu.getMenuId())){
//                    List<SysMenu> list = sysMenu.getList();
//                    if (CollectionUtils.isEmpty(list)) {
//                        list = new ArrayList<>();
//                        sysMenu.setList(list);
//                    }
//                    list.add(menu);
//                }
//            });
//        });
//        return roots;


        //这就是过滤出菜单表中的parentId等于用户用户传入的parenid，当然这里起初是0，顶级菜单，然后再收集起来放到集合中
        //第二次是递归调用的时候parentId等于2
        List<SysMenu> roots = menuList.stream()
                .filter(sysMenu -> sysMenu.getParentId().equals(parentId))
                .collect(Collectors.toList());
        //

//        roots.forEach(r -> r.setList(translateMenuTree(menuList, r.getMenuId())));
        //等价的
        for (SysMenu r : roots) {
            r.setList(translateMenuTree(menuList, r.getMenuId()));
        }
        return roots;
    }
}
